module SPI_tx (
    input sys_rst_n,                 //外部复位信号，低有效
    input SPI_clk,                   //25M
    input sys_clk,                   //50M
    input wire[47:0] Encoder_data,   // 编码器数据输入
    output reg tx_data_clk,          //发送的时钟
    input SPI_tx_en,                 //接收到编码器数据发送开始的标志信号
    output reg tx_data,              //发送数据线
//    output reg SPI_STE
    input dsp_tx                     //DSP IO口电平输入
);
//寄存器定义
reg tx_flag;
reg[47:0] data_buffer;
reg[7:0] send_cnt;
reg[7:0] send_cnt2;
//线定义 

//检测到SPI_tx_en，取出待发送数据到缓存
always @(posedge SPI_clk or negedge sys_rst_n) 
begin   
    if (!sys_rst_n) 
    begin
        tx_flag<=0;
        data_buffer<=0;
    end 
    else
    begin
        if(SPI_tx_en==1&&tx_flag==0)
        begin
            tx_flag<=1;
            data_buffer<=Encoder_data;     
        end
        else if(send_cnt==48)//发送完毕将缓存清零
        begin
            data_buffer<=0;
            tx_flag<=0;
        end
        else
        begin
            tx_flag<=tx_flag;
            data_buffer<=data_buffer;  
        end
    
    end
end        
 

always @(posedge SPI_clk or negedge sys_rst_n) 
begin   
    if (!sys_rst_n) 
    begin
        send_cnt<=0;                               
        tx_data<=1'b1;//数据线默认为高电平
    end 
    else
    begin
        if(tx_flag==1&&dsp_tx==1)
        begin
            if(send_cnt<48)//逐位发送数据
            begin
                tx_data<=data_buffer[47-send_cnt]; 
                send_cnt<=send_cnt+1; 
            end 
            else
            begin
                tx_data<=1;
                send_cnt<=0; 
            end
        end 
        else
        begin
            tx_data<=1;
            send_cnt<=0;
        end
    
    end
end        
 

//用于提供发送数据对应的时钟
always @(negedge sys_clk or negedge sys_rst_n) 
begin   
    if (!sys_rst_n) 
    begin
        send_cnt2<=0;
        tx_data_clk<=1'b1; //时钟线默认为高电平                                  
    end 
    else
    begin
        if(tx_flag==1&&dsp_tx==1)
        begin
            if(send_cnt2<97)
            begin
                if(send_cnt2>0)
                tx_data_clk<=~tx_data_clk;//25MHz时钟
                else
                tx_data_clk<=tx_data_clk;
            end    
            else
                tx_data_clk<=1;
            send_cnt2<=send_cnt2+1; 
        end 
        else
        begin
            tx_data_clk<=1;
            send_cnt2<=0;
        end
    end 
end    
  
endmodule








